#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pyperclip
from pypinyin import pinyin, Style
import os

def convert_to_pinyin(text):
    """
    将文本转换为拼音，同时保持原文格式
    返回：
    - py_lines: 每行字符对应的拼音列表的列表，非汉字用空字符串填充
    - hz_lines: 每行字符的列表的列表
    """
    # 按行分割文本
    lines = text.split('\n')
    
    # 初始化行列表
    py_lines = []
    hz_lines = []
    
    # 处理每一行
    for line in lines:
        # 初始化当前行的拼音列表和汉字列表
        current_py = []
        current_hz = []
        
        # 先获取整行的拼音，这样可以处理多音字
        # 使用errors='ignore'来跳过标点符号
        filtered_line = ''.join(char for char in line if '\u4e00' <= char <= '\u9fff')
        line_pinyin = pinyin(filtered_line, style=Style.TONE, heteronym=True)
        char_index = 0
        
        # 处理行中的每个字符
        for char in line:
            current_hz.append(char)
            if '\u4e00' <= char <= '\u9fff':  # 是汉字
                # 获取当前字符的拼音（可能有多个）
                py = line_pinyin[char_index][0]  # 取第一个拼音
                current_py.append(py)
                char_index += 1
            else:  # 非汉字（标点符号、空格等）
                current_py.append('')
        
        # 将当前行添加到结果中
        py_lines.append(current_py)
        hz_lines.append(current_hz)
    
    return {
        'py': py_lines,
        'hz': hz_lines
    }

def generate_html_content(text, pinyin_list, char_list):
    """
    生成公众号/知乎可用的HTML内容
    功能说明：像搭积木一样把拼音和汉字上下对齐排列
    """
    # 优化后的CSS样式定义
    css_styles = '''
    <style>
        .pinyin-container {
            line-height: 1.6;
            text-align: center;
            font-family: Arial, sans-serif;
        }
        .line-container {
            margin: 1em 0;
            display: flex;
            justify-content: center;
            flex-wrap: wrap;
        }
        .punctuation {
            display: inline-flex;
            align-items: flex-end;
            width: 1em;
            height: 2.4em;
        }
        .char-container {
            display: inline-flex;
            flex-direction: column;
            align-items: center;
            width: 2.5em;
            margin: 0 0px;
        }
        .pinyin-text {
            font-size: 0.7em;
            color: #666;
            line-height: 1.2;
            white-space: nowrap;
        }
        .hanzi-text {
            font-size: 1em;
            line-height: 1.2;
        }
        .empty-line {
            height: 1em;
        }
    </style>
    '''
    
    # 初始化HTML内容
    html_content = [css_styles, '<div class="pinyin-container">']
    
    # 逐行处理文本
    for i in range(len(pinyin_list)):
        if not any(pinyin_list[i]) and not any(char_list[i]):  # 处理空行
            html_content.append('<div class="empty-line"></div>')
            continue
        
        html_content.append('<div class="line-container">')
        
        j = 0
        while j < len(char_list[i]):
            char = char_list[i][j]
            
            # 处理标点符号
            if char in '·，。！？；：、【】《》""''':
                html_content.append(f'<div class="punctuation">{char}</div>')
                if char == '【':  # 如果是【，跳过后面的内容直到】
                    j += 1
                    while j < len(char_list[i]) and char_list[i][j] != '】':
                        if '\u4e00' <= char_list[i][j] <= '\u9fff':  # 是汉字
                            html_content.append(f'<div class="char-container"><div class="pinyin-text">{pinyin_list[i][j]}</div><div class="hanzi-text">{char_list[i][j]}</div></div>')
                        else:
                            html_content.append(f'<div class="char-container"><div class="pinyin-text"></div><div class="hanzi-text">{char_list[i][j]}</div></div>')
                        j += 1
                    if j < len(char_list[i]):  # 添加】并移动到下一个字符
                        html_content.append(f'<div class="punctuation">】</div>')
                        j += 1
                    continue
            # 处理普通汉字
            elif '\u4e00' <= char <= '\u9fff':
                pinyin = pinyin_list[i][j] if j < len(pinyin_list[i]) else ''
                html_content.append(f'<div class="char-container"><div class="pinyin-text">{pinyin}</div><div class="hanzi-text">{char}</div></div>')
            # 处理其他字符（如果不是空格）
            elif char.strip():
                html_content.append(f'<div class="char-container"><div class="pinyin-text"></div><div class="hanzi-text">{char}</div></div>')
            j += 1
        
        html_content.append('</div>')
    
    html_content.append('</div>')
    return '\n'.join(html_content)

def generate_console_output(text, pinyin_list, char_list):
    """
    生成纯文本格式的拼音和汉字输出
    每行拼音对应下一行汉字，保持垂直左对齐
    规则：
    1. 拼音最多6位
    2. 字与字之间增加1位间隔
    3. 第一个字前和最后一个字后不留间隔
    4. 英文标点占1位
    5. 汉字标点占2位
    """
    output = []
    
    # 定义标点符号类型
    chinese_puncts = '，。！？；：、【】《》""''）（'
    english_puncts = ',.!?;:\'\"[](){}'
    
    # 逐行处理
    for i in range(len(pinyin_list)):
        # 获取当前行的拼音和汉字
        pinyins = pinyin_list[i]
        hanzis = char_list[i]
        
        # 生成拼音行和汉字行
        pinyin_line = []
        hanzi_line = []
        
        # 处理每个字符
        for j in range(len(hanzis)):
            # 添加字间距（除了第一个字）
            if j > 0:
                pinyin_line.append(" ")
                hanzi_line.append(" ")
            
            if '\u4e00' <= hanzis[j] <= '\u9fff':  # 是汉字
                # 拼音固定6个字符宽度
                py = pinyins[j] if pinyins[j] else ""
                pinyin_line.append(f"{py:<6}")
                # 汉字固定6个字符宽度
                hanzi_line.append(f"{hanzis[j]:<6}")
            elif hanzis[j] in chinese_puncts:  # 中文标点
                pinyin_line.append("  ")  # 标点符号上方空两格
                hanzi_line.append(hanzis[j])
            elif hanzis[j] in english_puncts:  # 英文标点
                pinyin_line.append(" ")  # 标点符号上方空一格
                hanzi_line.append(hanzis[j])
            else:  # 其他字符
                pinyin_line.append(" ")
                hanzi_line.append(hanzis[j])
        
        # 添加到输出
        output.append("".join(pinyin_line))
        output.append("".join(hanzi_line))
    
    return '\n'.join(output)

if __name__ == "__main__":
    # 获取脚本所在目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # 读取输入文件
    with open(os.path.join(script_dir, 'text.txt'), 'r', encoding='utf-8') as f:
        input_text = f.read()
    
    # 生成拼音
    result = convert_to_pinyin(input_text)
    pinyin_list = result['py']
    char_list = result['hz']
    
    # 生成输出
    output = generate_console_output(input_text, pinyin_list, char_list)
    
    # 写入输出文件
    with open(os.path.join(script_dir, 'out.txt'), 'w', encoding='utf-8') as f:
        f.write(output)
    
    print("已生成带拼音的文本文件，请打开out.txt查看效果")